package com.nuc.zyt.framework.beans;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @ClassName MutablePropertyValues
 * @Description 用来存储管理多个PropertyValue对象
 * @Author 耀酱
 * @Date 2023/6/5 18:40
 * @Version 1.0
 */
// 采用迭代器模式

/**
 * Iterable 接口的主要作用是使不同的数据结构能够统一实现迭代器机制，
 * 从而提供更加便捷的访问方式。同时，由于 Iterator 可以移除元素，因此也可以方便地进行集合的操作，如添加、删除等。
 */
public class MutablePropertyValues implements Iterable<PropertyValue> {
    // final修饰集合，集合在被创建之后不可变
    private final List<PropertyValue> propertyValues;

    public MutablePropertyValues() {
        propertyValues = new ArrayList<PropertyValue>();
    }

    public MutablePropertyValues(List<PropertyValue> list){
        if(list == null){
            this.propertyValues = new ArrayList<>();
        }else {
            this.propertyValues = list;
        }
    }

    /**
     * 得到 依赖项数组
     * @return
     */
    public PropertyValue[] getPropertyValues(){
        return (PropertyValue[]) propertyValues.stream().toArray();
    }

    /**
     * 根据name 返回 依赖项对象
     * @param propertyName
     * @return
     */
    public PropertyValue getPropertyValue(String propertyName){
        for (PropertyValue propertyValue : propertyValues) {
            if(propertyValue.getName().equals(propertyName)){
                return propertyValue;
            }
        }
        return null;
    }

    public boolean isEmpty(){
        return propertyValues.isEmpty();
    }

    /**
     * 添加 依赖项对象，链式调用？
     * @param propertyValue
     * @return
     */
    public MutablePropertyValues addPropertyValue(PropertyValue propertyValue){
        for (int i = 0; i < propertyValues.size(); i++) {
            PropertyValue pro = propertyValues.get(i);
            if (pro.getName().equals(propertyValue.getName())) {
                propertyValues.set(i,propertyValue);
                return this;
            }
        }
        this.propertyValues.add(propertyValue);
        return this;
    }

    /**
     * 是否有重名bean
     * @param propertyName
     * @return
     */
    public boolean isProperty(String propertyName){
      return getPropertyValue(propertyName) != null;
    }


    @Override
    public Iterator iterator() {
        return propertyValues.iterator();
    }
}
